package net.vinote.smart.platform.module.database;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.regex.Pattern;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.json.JSONObject;

/***
 * 抽象实体类，所有实体类的必须继承该类
 */
public abstract class Entity {
	public String toJSON(String... ignoreField) {
		Pattern p = Pattern.compile("get[A-Z](\\w+)");
		JSONObject jsonBo = new JSONObject();
		try {
			Method methods[] = getClass().getDeclaredMethods();
			for (int i = 0; i < methods.length; i++) {
				String name = methods[i].getName();// 方法名
				String returnType = methods[i].getReturnType().getSimpleName();// 类型
				Class<?> parmTypes[] = methods[i].getParameterTypes();
				int mod = methods[i].getModifiers();// 修饰符
				if (!p.matcher(name).matches())// 方法名必须为get开头且第四个字母大写
					continue;
				if (parmTypes != null && parmTypes.length > 0)// 无参
					continue;
				if (!isValidType(returnType))// 返回类型
					continue;
				if (mod != Modifier.PUBLIC)// 公共方法
					continue;
				String fieldName = String.valueOf(name.charAt(3)).toLowerCase()
						+ name.substring(4);
				// 是否为被过滤的成员变量
				if (ignoreField != null) {
					boolean ignore = false;
					for (int j = 0; j < ignoreField.length; j++) {
						if (fieldName.equals(ignoreField[j])) {
							ignore = true;
							break;
						}
					}
					if (ignore)
						continue;
				}
				jsonBo.put(fieldName, methods[i].invoke(this));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return jsonBo.toString();
	}

	/**
	 * 传入的类型是否为该实体类可识别的类型
	 */
	protected final boolean isValidType(String type) {
		return "int".equals(type) || "String".equals(type);
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return ToStringBuilder.reflectionToString(this,
				ToStringStyle.SHORT_PREFIX_STYLE);
	}

}
